package com.线程Thread.线程同步;

@SuppressWarnings("all")
public class Synchronized互斥锁 {
    public static void main(String[] args) {
        /***     Synchronized 互斥锁
         * 定义：
         * 1.在多线程编程中，一些敏感数据不允许被多个线程同时访问，
         * 此时就可以用同步访问技术来保证数据在任意时刻，最多有一个线程访问，以保证数据完整性；
         * 即：多个线程同时操作一个数据，在某一刻最对只有一个线程操作；
         *
         * 缺点： 导致效率降低，因为同一时刻只能由一个线程执行，就像单车道比三车道效率低；
         *
         *  加锁部位：
         * 1.方法上加锁，会导致抢到的线程把所有的票卖了，
         * 2.代码块加锁：这样所以普线程都有可能卖票；
         *
         * 加锁对象：
         * T t = new T();  //创建一个线程
         * new Thread(t).start();  传入的是同一个对象t,让他们抢的锁是同一对象t；
         * new Thread(t).start();   传入的是同一个对象t
         * new Thread(t).start();    传入的是同一个对象t
         * 1（非静态）.同步方法的锁可以是this（指当前线程类的对象） 即：让多个线程来抢这个this对象锁；
         *   也可以是其他线程类的对象，但他们必须是同一个对象
         *      public void m1（）{  普通方法
         *           synchronized (this) {} 这里指只有给t对象加锁 }
         * 2.（静态）：同步方法的锁是加在当前类本身；
         *      public static void m2（）{ 静态方法
         *          synchronized (T.class) {} 这里指给T类加锁,就不能用this了，要用类名.class  }
         */

        /** 模拟火车票出售，使用synchronized保证不超卖；*/
        T t = new T();  //创建一个线程
        new Thread(t, "A").start();  ///让三个线程执行一个t
        new Thread(t, "B").start();  ///让三个线程执行一个t
        new Thread(t, "C").start();  ///让三个线程执行一个t
    }
}
@SuppressWarnings("all")
class T implements Runnable {
    int n = 100;   ///票总数
    @Override
    public  void run() {
        while (true) {
            synchronized (this) {   ///this指类当前同一对象 保证所个线程都抢这一个this对象； 加锁，保证同一时刻，只有一个线程进去操作，两个在等待，
                if (n <= 0) {  ///如果判断票<0就退出；，保证了不会超卖；
                    System.out.println(Thread.currentThread().getName()+"窗口售票结束");
                    break;
                }
                /// 如果还有票，就售出；
                System.out.println(Thread.currentThread().getName() + "窗口售出1张  剩余  " + --n);
            }

            try {  /// 售出后休眠一会，给其他线程时间；
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

    }
}
